﻿namespace WoWArmoryParser
{
    public class MeleeInfo
    {
        public MeleeInfo()
        {
            _MainHand = new WeaponInfo();
            _OffHand = new WeaponInfo();
            _HitRating = new HitRatingInfo();
            _Crit = new CritInfo();
            _AttackPower = new AttackPowerInfo();
        }

        protected WeaponInfo _MainHand;
        protected WeaponInfo _OffHand;
        protected HitRatingInfo _HitRating;
        protected CritInfo _Crit;
        protected AttackPowerInfo _AttackPower;

        public WeaponInfo MainHand
        {
            get { return _MainHand; }
        }

        public WeaponInfo OffHand
        {
            get { return _OffHand; }
        }

        public HitRatingInfo HitRating
        {
            get { return _HitRating; }
        }

        public CritInfo CritChance
        {
            get { return _Crit; }
        }

        public AttackPowerInfo AttackPower
        {
            get { return _AttackPower; }
        }
    }

    public class RangedInfo
    {
        public RangedInfo()
        {
            _Weapon = new WeaponInfo();
            _HitRating = new HitRatingInfo();
            _Crit = new CritInfo();
            _AttackPower = new AttackPowerInfo();
        }

        protected WeaponInfo _Weapon;
        protected HitRatingInfo _HitRating;
        protected CritInfo _Crit;
        protected AttackPowerInfo _AttackPower;

        public WeaponInfo Weapon
        {
            get { return _Weapon; }
        }

        public HitRatingInfo HitRating
        {
            get { return _HitRating; }
        }

        public CritInfo CritChance
        {
            get { return _Crit; }
        }

        public AttackPowerInfo AttackPower
        {
            get { return _AttackPower; }
        }
    }

    public class SpellInfo
    {

        public SpellInfo()
        {
            _Arcane = new SpellSchool();
            _Fire = new SpellSchool();
            _Frost = new SpellSchool();
            _Holy = new SpellSchool();
            _Nature = new SpellSchool();
            _Shadow = new SpellSchool();

            _HitRating = new HitRatingInfo();
            _ManaRegen = new ManaRegenInfo();
        }

        protected SpellSchool _Arcane;
        protected SpellSchool _Fire;
        protected SpellSchool _Frost;
        protected SpellSchool _Holy;
        protected SpellSchool _Nature;
        protected SpellSchool _Shadow;

        public SpellSchool Arcane
        {
            get { return _Arcane; }
        }

        public SpellSchool Fire
        {
            get { return _Fire; }
        }

        public SpellSchool Frost
        {
            get { return _Frost; }
        }

        public SpellSchool Holy
        {
            get { return _Holy; }
        }

        public SpellSchool Nature
        {
            get { return _Nature; }
        }

        public SpellSchool Shadow
        {
            get { return _Shadow; }
        }

        protected int _CritRating;
        public int CritRating
        {
            get { return _CritRating; }
            set { _CritRating = value; }
        }

        protected HitRatingInfo _HitRating;
        public HitRatingInfo HitRating
        {
            get { return _HitRating; }
        }

        protected ManaRegenInfo _ManaRegen;
        public ManaRegenInfo ManaRegen
        {
            get { return _ManaRegen; }
        }

        protected int _SpellPenetration;
        public int SpellPenetration
        {
            get { return _SpellPenetration; }
            set { _SpellPenetration = value; }
        }

        protected int _HealingBonus;
        public int HealingBonus
        {
            get { return _HealingBonus; }
            set { _HealingBonus = value; }
        }
    }

    public class DefenseInfo
    {
        public DefenseInfo()
        {
            _Armor = new ArmorInfo();
            _Defense = new DefenseStatInfo();
            _Parry = new ParryInfo();
            _Block = new BlockInfo();
            _Dodge = new DodgeInfo();
            _Resilience = new ResilienceInfo();
        }

        protected ArmorInfo _Armor;
        protected DefenseStatInfo _Defense;
        protected DodgeInfo _Dodge;
        protected ParryInfo _Parry;
        protected BlockInfo _Block;
        protected ResilienceInfo _Resilience;

        public ArmorInfo Armor
        {
            get { return _Armor; }
        }

        public DefenseStatInfo Defense
        {
            get { return _Defense; }
        }

        public DodgeInfo Dodge
        {
            get { return _Dodge; }
        }

        public ParryInfo Parry
        {
            get { return _Parry; }
        }

        public BlockInfo Block
        {
            get { return _Block; }
        }

        public ResilienceInfo Resilience
        {
            get { return _Resilience; }
        }
    }

    public class ManaRegenInfo
    {
        protected double _WhileCasting;
        protected double _WhileNotCasting;

        public double WhileCasting
        {
            get { return _WhileCasting; }
            set { _WhileCasting = value; }
        }

        public double WhileNotCasting
        {
            get { return _WhileNotCasting; }
            set { _WhileNotCasting = value; }
        }
    }

    public class HitRatingInfo
    {
        protected double _IncreasedHitChance;
        protected int _Value;

        public double IncreasedHitChance
        {
            get { return _IncreasedHitChance; }
            set { _IncreasedHitChance = value; }
        }

        public int Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }

    public class SpellSchool
    {
        public SpellSchool()
        {

        }

        protected int _BonusDmg;
        protected double _CritChance;

        public int DamageBonus
        {
            get { return _BonusDmg; }
            set { _BonusDmg = value; }
        }

        public double CritChance
        {
            get { return _CritChance; }
            set { _CritChance = value; }
        }
    }

    public class WeaponInfo
    {
        public WeaponInfo()
        {
            _Skill = new SkillInfo();
            _Damage = new DamageInfo();
            _Speed = new SpeedInfo();
        }

        public SkillInfo Skill
        {
            get { return _Skill; }
        }

        public DamageInfo Damage
        {
            get { return _Damage; }
        }

        public SpeedInfo Speed
        {
            get { return _Speed; }
        }

        protected SkillInfo _Skill;
        protected DamageInfo _Damage;
        protected SpeedInfo _Speed;
    }


    public class SkillInfo
    {
        protected int _Rating;
        protected int _Value;

        public int Rating
        {
            get { return _Rating; }
            set { _Rating = value; }
        }

        public int Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }

    public class DamageInfo
    {
        protected double _DPS;
        protected int _Max;
        protected int _Min;
        protected double _Percent;
        protected double _Speed;

        public double DPS
        {
            get { return _DPS; }
            set { _DPS = value; }
        }

        public int Max
        {
            get { return _Max; }
            set { _Max = value; }
        }

        public int Min
        {
            get { return _Min; }
            set { _Min = value; }
        }

        public double Percent
        {
            get { return _Percent; }
            set { _Percent = value; }
        }

        public double Speed
        {
            get { return _Speed; }
            set { _Speed = value; }
        }
    }

    public class SpeedInfo
    {
        protected double _HastePercent;
        protected int _HasteRating;
        protected double _Value;

        public double HastePercent
        {
            get { return _HastePercent; }
            set { _HastePercent = value; }
        }

        public int HasteRating
        {
            get { return _HasteRating; }
            set { _HasteRating = value; }
        }

        public double Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }

    public class RatingStat
    {
        protected double _Percent;
        protected double _IncreasedByRating;
        protected double _Rating;

        public double Percent
        {
            get { return _Percent; }
            set { _Percent = value; }
        }

        public double IncreasedByRating
        {
            get { return _IncreasedByRating; }
            set { _IncreasedByRating = value; }
        }

        public double Rating
        {
            get { return _Rating; }
            set { _Rating = value; }
        }
    }

    public class CritInfo : RatingStat
    {
    }

    public class AttackPowerInfo
    {

        protected int _Base;
        protected int _Effective;
        protected double _IncreasedDPS;

        public int Base
        {
            get { return _Base; }
            set { _Base = value; }
        }

        public int Effective
        {
            get { return _Effective; }
            set { _Effective = value; }
        }

        public double IncreasedDPS
        {
            get { return _IncreasedDPS; }
            set { _IncreasedDPS = value; }
        }
    }

    public class ArmorInfo
    {
        protected int _Base;
        protected int _Effective;
        protected double _DamageReductionPercent;

        public int Base
        {
            get { return _Base; }
            set { _Base = value; }
        }

        public int Effective
        {
            get { return _Effective; }
            set { _Effective = value; }
        }

        public double DamageReductionPercent
        {
            get { return _DamageReductionPercent; }
            set { _DamageReductionPercent = value; }
        }
    }

    public class DefenseStatInfo
    {

        protected double _Rating;
        public double Rating
        {
            get { return _Rating; }
            set { _Rating = value; }
        }

        protected double _Value;
        public double Value
        {
            get { return _Value; }
            set { _Value = value; }
        }
    }

    public class DodgeInfo : RatingStat
    {
    }

    public class ParryInfo : RatingStat
    {
    }

    public class BlockInfo : RatingStat
    {
    }

    public class ResilienceInfo
    {
        protected double _Damage;
        protected double _Hit;
        protected double _Rating;

        public double DamageReduction
        {
            get { return _Damage; }
            set { _Damage = value; }
        }

        public double HitReduction
        {
            get { return _Hit; }
            set { _Hit = value; }
        }

        public double Rating
        {
            get { return _Rating; }
            set { _Rating = value; }
        }
    }
}
